package com.csx.governance.traffic.adapter.outbound.openfeign;

import com.csx.governance.traffic.core.TransportableAttributes;
import feign.Client;
import feign.RequestInterceptor;
import feign.RequestTemplate;

import java.util.Map;

/**
 * <p>该类是OpenFeign请求拦截器</p>
 * <p>该类主要负责修改 由OpenFeign发起的外调请求的请求对象 {@link feign.Request} 的请求头,添加全链路灰度标识(例如 swimLane泳道ID等)。 该拦截器是全局的,对所有的 {@link Client} 生效</p>
 * <p>之所以要通过该拦截器修改请求,是因为 {@link feign.Request} 中的请求头是 {@link java.util.Collections.UnmodifiableMap} 类型,无法通常正常手段
 * 修改请求头</p>
 * @author cuisongxu
 * @date 2023/4/12 10:23
 */
public class CustomFeignRequestInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate template) {
        Map<String, String> attributes = TransportableAttributes.getAttributes();
        // 向请求头中添加透传请求属性,swimLaneId就是在此处放入到外调请求中
        attributes.forEach(template::header);
    }
}
